package com.cvcetic.ciudadverde;

import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_DATOS;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_DATOS_EU;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_FRECUENCIA;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_HORA_FIN;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_HORA_INICIO;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_ID;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_ID_TIPO;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_NOMBRE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_NOMBRE_EU;
import static com.cvcetic.ciudadverde.bbdd.BBDD.LINEAS_TABLE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_DIRECCION;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_ID;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_ID_TIPO;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_LATITUD;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_LINEAS_ID_LINEA;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_LINEAS_ID_PUNTO;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_LINEAS_TABLE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_LONGITUD;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_NOMBRE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_NOMBRE_EU;
import static com.cvcetic.ciudadverde.bbdd.BBDD.PUNTOS_TABLE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.TIPOS_ID;
import static com.cvcetic.ciudadverde.bbdd.BBDD.TIPOS_NOMBRE;
import static com.cvcetic.ciudadverde.bbdd.BBDD.TIPOS_NOMBRE_EU;
import static com.cvcetic.ciudadverde.bbdd.BBDD.TIPOS_TABLE;

import java.util.ArrayList;
import java.util.List;

import android.app.Application;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.cvcetic.ciudadverde.bbdd.BBDD;
import com.cvcetic.ciudadverde.beans.Linea;
import com.cvcetic.ciudadverde.beans.Punto;
import com.cvcetic.ciudadverde.beans.Tipo;

public class Aplicacion extends Application {
	private List<Punto> pTransportes;
	private List<Punto> pBicis;
	private SQLiteDatabase db;
	private Punto localizacion;


	@Override
	public void onCreate() {
		super.onCreate();
		BBDD helper = new BBDD(this);
		db = helper.getWritableDatabase();
		localizacion= new Punto(42.87571f,-2.6749f);

		try {
			if (null == pBicis) {
				pBicis = loadPuntosBici();
				pTransportes = loadPuntosTransporte();
			}
		} catch (Exception ex) {
			Log.i("Error", ex.toString());
		}

	}

	public void addTipo(Tipo t) {
		assert (null != t);

		ContentValues values = new ContentValues();
		values.put(TIPOS_NOMBRE, t.getNombre_es());
		values.put(TIPOS_NOMBRE_EU, t.getNombre_eu());

		t.setId(db.insert(TIPOS_TABLE, null, values));
	}

	public List<Tipo> loadTipos() {
		Cursor c = db.query(TIPOS_TABLE, null, null, null, null, null, null);
		List<Tipo> tipos = new ArrayList<Tipo>();
		if (!c.isAfterLast()) {
			do {
				Tipo t = new Tipo();
				t.setId(c.getLong(0));
				t.setNombre_es(c.getString(1));
				t.setNombre_eu(c.getString(2));

				tipos.add(t);
			} while (c.moveToNext());
		}
		c.close();

		return tipos;
	}

	public Tipo loadTipo(Long idTipo) {
		assert (null != idTipo);

		Cursor c = db.query(TIPOS_TABLE, null, TIPOS_ID + " = ?",
				new String[] { idTipo.toString() }, null, null, null);
		Tipo t = new Tipo();
		if (!c.isAfterLast()) {
			t.setId(c.getLong(0));
			t.setNombre_es(c.getString(1));
			t.setNombre_eu(c.getString(2));
		}
		c.close();

		return t;
	}

	public void addPunto(Punto p) {
		assert (null != p);

		ContentValues values = new ContentValues();
		values.put(PUNTOS_LONGITUD, p.getLongitud());
		values.put(PUNTOS_LATITUD, p.getLatitud());
		values.put(PUNTOS_DIRECCION, p.getDireccion());
		values.put(PUNTOS_NOMBRE, p.getNombre_es());
		values.put(PUNTOS_NOMBRE_EU, p.getNombre_eu());
		values.put(PUNTOS_ID_TIPO, p.getIdtipo());

		p.setId(db.insert(PUNTOS_TABLE, null, values));
	}

	public Punto loadPunto(Long idPunto) {
		assert (null != idPunto);

		Cursor c = db.query(PUNTOS_TABLE, new String[] { PUNTOS_ID,
				PUNTOS_DIRECCION, PUNTOS_NOMBRE, PUNTOS_NOMBRE_EU,
				PUNTOS_LONGITUD, PUNTOS_LATITUD },
				PUNTOS_ID + " = " + idPunto.toString(), null, null, null, null);
		Punto p = new Punto();
		if (!c.isAfterLast()) {
			c.moveToFirst();

			p.setId(c.getLong(0));
			p.setDireccion(c.getString(1));
			p.setNombre_es(c.getString(2));
			p.setNombre_eu(c.getString(3));
			p.setLongitud(c.getFloat(4));
			p.setLatitud(c.getFloat(5));
		}
		c.close();

		return p;
	}

	public List<Punto> loadPuntosTransporte() {

		Cursor c = db.query(PUNTOS_TABLE, new String[] { PUNTOS_ID,
				PUNTOS_DIRECCION, PUNTOS_NOMBRE, PUNTOS_NOMBRE_EU,
				PUNTOS_LONGITUD, PUNTOS_LATITUD }, PUNTOS_ID_TIPO + " = 2",
				null, null, null, null);
		List<Punto> puntos = new ArrayList<Punto>();
		if (!c.isAfterLast()) {
			c.moveToFirst();
			do {
				Punto p = new Punto();

				p.setId(c.getLong(0));
				p.setDireccion(c.getString(1));
				p.setNombre_es(c.getString(2));
				p.setNombre_eu(c.getString(3));
				p.setLongitud(c.getFloat(4));
				p.setLatitud(c.getFloat(5));
				p.setIdtipo((long) 2);

				puntos.add(p);
			} while (c.moveToNext());
		}
		c.close();
		Log.d("transportes", puntos.size() + "");

		return null;
	}

	public List<Punto> loadPuntosBici() {
		Cursor c = db.query(PUNTOS_TABLE, new String[] { PUNTOS_ID,
				PUNTOS_DIRECCION, PUNTOS_NOMBRE, PUNTOS_NOMBRE_EU,
				PUNTOS_LONGITUD, PUNTOS_LATITUD }, PUNTOS_ID_TIPO + " = 1",
				null, null, null, null);
		List<Punto> puntos = new ArrayList<Punto>();
		if (!c.isAfterLast()) {
			c.moveToFirst();
			do {
				Punto p = new Punto();

				p.setId(c.getLong(0));
				p.setDireccion(c.getString(1));
				p.setNombre_es(c.getString(2));
				p.setNombre_eu(c.getString(3));
				p.setLongitud(c.getFloat(4));
				p.setLatitud(c.getFloat(5));
				p.setIdtipo((long) 1);

				puntos.add(p);
			} while (c.moveToNext());
		}
		c.close();
		Log.d("bicis", puntos.size() + "");

		return puntos;
	}

	public void addLinea(Linea l) {
		assert (null != l);

		ContentValues values1 = new ContentValues();
		values1.put(LINEAS_NOMBRE, l.getNombre_es());
		values1.put(LINEAS_NOMBRE_EU, l.getNombre_eu());
		values1.put(LINEAS_HORA_INICIO, l.getHorainicio().toString());
		values1.put(LINEAS_HORA_FIN, l.getHoraFin().toString());
		values1.put(LINEAS_FRECUENCIA, l.getFrecuencia());
		values1.put(LINEAS_DATOS, l.getDatos_es());
		values1.put(LINEAS_DATOS_EU, l.getDatos_eu());
		values1.put(LINEAS_ID_TIPO, l.getIdtipo().getId());

		l.setId(db.insert(LINEAS_TABLE, null, values1));

		for (Punto p : l.getParadas()) {
			ContentValues values2 = new ContentValues();
			values2.put(PUNTOS_LINEAS_ID_LINEA, l.getId());
			values2.put(PUNTOS_LINEAS_ID_PUNTO, p.getId());

			db.insert(PUNTOS_LINEAS_TABLE, null, values2);
		}
	}

	public Linea loadLinea(Long idLinea) {
		Cursor c = db.query(LINEAS_TABLE, new String[] { LINEAS_ID,
				LINEAS_NOMBRE, LINEAS_NOMBRE_EU, LINEAS_HORA_INICIO,
				LINEAS_HORA_FIN, LINEAS_FRECUENCIA, LINEAS_DATOS, LINEAS_DATOS_EU, LINEAS_ID_TIPO }, LINEAS_ID + " = " + idLinea.toString(),
				null, null, null, null);
		Linea l = new Linea();
		if (!c.isAfterLast()) {
			l.setId(c.getLong(0));
			l.setNombre_es(c.getString(1));
			l.setNombre_eu(c.getString(2));
			l.setHorainicio(c.getString(3));
			l.setHoraFin(c.getString(4));
			l.setFrecuencia(c.getInt(5));
			l.setDatos_es(c.getString(6));
			l.setDatos_eu(c.getString(7));

			l.setIdtipo(loadTipo(c.getLong(8)));
		}
		c.close();

		return l;
	}
	
	public Punto getLocalizacion() {
		return localizacion;
	}

	public void setLocalizacion(Punto localizacion) {
		this.localizacion = localizacion;
	}


	/*
	 * public List<Contact> getContacts(){ return contacts; } private void
	 * loadContacts() { contacts = new ArrayList<Contact>(); Cursor
	 * contactCursor = db.query(CONTACTO_TABLE, new String[] {CONTACTO_ID,
	 * CONTACTO_NOMBRE, CONTACTO_TELEFONO, CONTACTO_DIRECCION, CONTACTO_LATITUD,
	 * CONTACTO_LONGITUD, CONTACTO_URL_FOTO, CONTACTO_URL_FOTO_THUMBNAIL}, null,
	 * null, null, null, null); contactCursor.moveToFirst(); Contact p; if (!
	 * contactCursor.isAfterLast()) { do { Long id = contactCursor.getLong(0);
	 * String nombre = contactCursor.getString(1); String telefono =
	 * contactCursor.getString(2); p = new Contact(); p.setId(id);
	 * p.setNombre(nombre); p.setTelefono(telefono);
	 * p.setDireccion(contactCursor.getString(3));
	 * p.setLatitud(contactCursor.getFloat(4));
	 * p.setLongitud(contactCursor.getFloat(5));
	 * p.setUrlFoto(contactCursor.getString(6));
	 * p.setUrlFotoThumbnail(contactCursor.getString(7)); contacts.add(p); }
	 * while (contactCursor.moveToNext()); }
	 * 
	 * contactCursor.close();
	 * 
	 * }
	 * 
	 * public void addContact(Contact c){ assert(null != c);
	 * 
	 * ContentValues values = new ContentValues(); values.put(CONTACTO_NOMBRE,
	 * c.getNombre()); values.put(CONTACTO_TELEFONO, c.getTelefono());
	 * values.put(CONTACTO_DIRECCION, c.getDireccion());
	 * values.put(CONTACTO_URL_FOTO, c.getUrlFoto());
	 * values.put(CONTACTO_URL_FOTO_THUMBNAIL, c.getUrlFotoThumbnail());
	 * values.put(CONTACTO_LONGITUD, c.getLongitud());
	 * values.put(CONTACTO_LATITUD, c.getLatitud());
	 * 
	 * c.setId(db.insert(CONTACTO_TABLE, null, values));
	 * 
	 * contacts.add(c); } public void saveContact(Contact c) { assert(null !=
	 * c); ContentValues values = new ContentValues();
	 * values.put(CONTACTO_NOMBRE, c.getNombre()); values.put(CONTACTO_TELEFONO,
	 * c.getTelefono()); values.put(CONTACTO_DIRECCION, c.getDireccion());
	 * values.put(CONTACTO_URL_FOTO, c.getUrlFoto());
	 * values.put(CONTACTO_URL_FOTO_THUMBNAIL, c.getUrlFotoThumbnail());
	 * values.put(CONTACTO_LONGITUD, c.getLongitud());
	 * values.put(CONTACTO_LATITUD, c.getLatitud());
	 * 
	 * long id = c.getId(); String where = String.format("%s = %d", CONTACTO_ID,
	 * id);
	 * 
	 * db.update(CONTACTO_TABLE, values, where, null); int tam=contacts.size();
	 * for(int i=0;i<tam;i++){ Contact c2=contacts.get(i);
	 * if(c.getId()==c2.getId()){ c2.setNombre(c.getNombre());
	 * c2.setTelefono(c.getTelefono()); c2.setDireccion(c.getDireccion());
	 * c2.setUrlFoto(c.getUrlFoto());
	 * c2.setUrlFotoThumbnail(c.getUrlFotoThumbnail());
	 * c2.setLongitud(c.getLongitud()); c2.setLatitud(c.getLatitud()); } } }
	 * public void removeContact(Contact c) { String where =
	 * String.format("%s = %s", CONTACTO_ID, c.getId());
	 * db.delete(CONTACTO_TABLE, where, null); Iterator<Contact> iter=
	 * contacts.iterator(); int i=0; int borrado = 0; boolean encontrado =
	 * false; Log.i("A borrar!!!",c.getId().toString()); while(iter.hasNext()){
	 * Contact it= (Contact)iter.next(); if(it.getId()==c.getId()){ encontrado =
	 * true; borrado = i; Log.i("Borrando",new Integer(i).toString()); } i++; }
	 * if (encontrado) { contacts.remove(borrado); } }
	 * 
	 * public Contact getContact(Long id){ int count =contacts.size(); for(int
	 * i=0;i<count;i++){ Contact c= contacts.get(i); if(c.getId().equals(id)){
	 * return c; } } return new Contact(); } public void
	 * removePersonByName(String s){ //TODO: quitar persona por nombre
	 * //persons.remove(s); }
	 */

}
